package org.dromara.workflow.flowable.cmd;

import org.flowable.common.engine.impl.interceptor.Command;
import org.flowable.common.engine.impl.interceptor.CommandContext;
import org.flowable.engine.impl.persistence.entity.ExecutionEntity;
import org.flowable.engine.impl.persistence.entity.ExecutionEntityManager;
import org.flowable.engine.impl.util.CommandContextUtil;

import java.io.Serializable;


/**
 * @Author 刘武贵
 * @Date 2024/8/15 22:00
 * @Description 功能描述：删除执行数据
 */
/**
 * 删除执行命令的类，实现了Command接口和Serializable接口.
 * 该类描述了如何向执行服务发送删除命令的操作，以终止当前正在运行的执行流程.
 */
public class DeleteExecutionCmd implements Command<Void>, Serializable {

    /**
     * 执行id
     */
    private final String executionId;

    /**
     * 创建一个删除执行实例的命令
     *
     * @param executionId 要删除的执行实例的唯一标识
     */
    public DeleteExecutionCmd(String executionId) {
        this.executionId = executionId;
    }

    /**
     * 执行删除给定执行实例及其相关数据的操作
     * 本方法覆盖了来自父类的execute方法，专门用于在一个流程执行实例上执行删除操作
     * 它通过执行实例ID查找执行实例，如果找到，则删除之
     *
     * @param commandContext 命令上下文对象，提供了访问执行实体管理器等必要组件的上下文环境
     */
    @Override
    public Void execute(CommandContext commandContext) {
        // 获取执行实体管理器，用于操作执行实体
        ExecutionEntityManager executionEntityManager = CommandContextUtil.getExecutionEntityManager();
        // 根据执行实例ID查找执行实体
        ExecutionEntity entity = executionEntityManager.findById(executionId);
        // 如果找到了执行实体，则执行删除操作
        if (entity != null) {
            executionEntityManager.deleteExecutionAndRelatedData(entity, "", false, false);
        }
        return null;
    }
}
